/////////////////////////////////////////////////////////////////////////
//
// Amuse Engine SDK - system/interfaces
// Copyright( c) 2014.  All Rights Reserved
//
// File:		AESystemAccessI.h
// Author:		Gianluca Belardelli
// Date:		04/06/2014
//
/////////////////////////////////////////////////////////////////////////
#ifndef _AESYSTEMACCESSI_H_
#define _AESYSTEMACCESSI_H_

class AESystemAccessI
{
protected:
    /// <summary>
    ///   Gets a system by its name.
    /// </summary>
    /// <param name="pszSystemName">The name of the system to get.</param>
    /// <returns>A handle to the system or null if the system doesn't exist.</returns>
    virtual AEEngineSystem *GetSystem( const char *lpszSystemName ) = 0;

    /// <summary>
    ///   Gets a system by its type.
    /// </summary>
    /// <param name="Type">The type of the system to get.</param>
    /// <returns>A handle to the system or null if the system doesn't exist.</returns>
    virtual AEEngineSystem *GetSystem( AEUINT32 uiSysType ) = 0;

    /// <summary>
    ///   Gets a system scene by its system name.
    /// </summary>
    /// <param name="pszSystemName">The name of the system scene to get.</param>
    /// <returns>A handle to the system scene or null if it doesn't exist.</returns>
    virtual AESystemSceneI *GetScene( const char *lpszSceneName ) = 0;

    /// <summary>
    ///   Gets a system scene by its system type.
    /// </summary>
    /// <param name="Type">The type of the system scene to get.</param>
    /// <returns>A handle to the system scene or null if it doesn't exist.</returns>
    virtual AESystemSceneI *GetScene( AEUINT32 uiSysType ) = 0;

    /// <summary>
    ///   Gets a system object by its system name.
    /// </summary>
    /// <param name="pszSystemName">The name of the system object to get.</param>
    /// <param name="pszName">The name of the object.</param>
    /// <returns>A handle to the system object or null if it doesn't exist.</returns>
    virtual AESystemObjectI *GetSystemEntity( const char *lpszSystemName, const char *lpszEntityName ) = 0;

    /// <summary>
    ///   Gets a system object by its system type and name.
    /// </summary>
    /// <param name="Type">The type of the system object to get.</param>
	/// <param name="pszName">Name of the object.</param>
    /// <returns>A handle to the system object or null if it doesn't exist.</returns>
    virtual AESystemObjectI *GetSystemEntity( AEUINT32 uiSysType, const char *lpszEntityName ) = 0;

    /// <summary>
    ///   Gets a single system property.
    /// </summary>
    /// <param name="hSystem">The handle of the system.</param>
    /// <param name="Property">The property to store the data in.  The name of the property
    ///  must be set prior to entering this function.</param>
    virtual AEProperty *GetSystemProperty( AEEngineSystem *lpSystem, const char *lpPropertyName ) = 0;

    /// <summary>
    ///   Sets a single system property.
    /// </summary>
    /// <param name="hSystem">The handle of the system.</param>
    /// <param name="Property">The property to containing the property data.  This must be
    ///  properly filled in prior to calling this function.</param>
    virtual void SetSystemProperty( AEEngineSystem *lpSystem, AEProperty *lpProperty ) = 0;

    /// <summary>
    ///   Gets a single system scene property.
    /// </summary>
    /// <param name="hScene">The handle of the system scene.</param>
    /// <param name="Property">The property to store the data in.  The name of the property
    ///  must be set prior to entering this function.</param>
    virtual AEProperty *GetSceneProperty( AESystemSceneI *lpScene, const char *lpPropertyName ) = 0;

    /// <summary>
    ///   Sets a single system scene property.
    /// </summary>
    /// <param name="hScene">The handle of the system scene.</param>
    /// <param name="Property">The property to containing the property data.  This must be
    ///  properly filled in prior to calling this function.</param>
    virtual void SetSceneProperty( AESystemSceneI *lpScene, AEProperty *lpProperty ) = 0;

    /// <summary>
    ///   Gets a single object property.
    /// </summary>
    /// <param name="hObject">The handle of the system object.</param>
    /// <param name="Property">The property to store the data in.  The name of the property
    ///  must be set prior to entering this function.</param>
    virtual AEProperty *GetEntityProperty( AESystemObjectI *lpEntity, const char *lpPropertyName ) = 0;

    /// <summary>
    ///   Sets a single object property.
    /// </summary>
    /// <param name="hObject">The handle of the system object.</param>
    /// <param name="Property">The property to containing the property data.  This must be
    ///  properly filled in prior to calling this function.</param>
    virtual void SetEntityProperty( AESystemObjectI *lpEntity, AEProperty *lpProperty ) = 0;
};

#endif // _AESYSTEMACCESSI_H_
